package com.wangjin.javaProject.request;

import java.io.*;
import java.net.*;
import java.util.Map;
import java.util.Set;

/**
 * @Creator: WangJin
 * @desc:该类用于封装提供网络请求的功能代码, 用于发起网络请求, 并将网络的数据返回
 * @Creation Data: 2021/12/12 12:37
 **/
public class HttpUtils {
    /**
     * 该函数用于实现get请求, 并将请求结果进行返回
     * @param path 请求的资源路径
     * @return 请求的结果
     * */
    public static String get(String path) {
        InputStream inputStream = null;
        InputStreamReader inputStreamReader = null;
        BufferedReader reader = null;
        String line = "";   //最开始的空行
        String result = ""; //每次读取到后都要累积起来的读取结构
        try {
            URL url = new URL(path);
            URLConnection connection = url.openConnection();
            //连接
            connection.connect();
            //
            inputStream = connection.getInputStream();
            //字符流
            inputStreamReader = new InputStreamReader(inputStream);
            reader = new BufferedReader(inputStreamReader);
//            String line = reader.readLine();
//            while (line != null) {
//                reader.readLine();
//            }
            while ((line = reader.readLine()) != null) {
                result = result + line;
            }

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭读取流
            try {
                if (reader != null) {

                    reader.close();

                }
                if (inputStreamReader != null) {
                    inputStreamReader.close();
                }
                if (inputStream != null) {
                    inputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }

    /**
     * 该方法用于实现发送一个post请求，并将请求的解析到返回
     * @param path  要请求的资源路径
     * @param header 请求头信息
     * @param data 请求体数据
     * @return 请求的响应结果
     */
    public static String post(String path, Map<String,String> header, byte[] data){
        BufferedReader reader = null;//读取想应结果的字符读取流
        OutputStream output = null;
        String result = "";//最后的结果
        try {
            URL url = new URL(path);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");//设置为post请求

            conn.setDoInput(true);//允许从服务端接收数据
            conn.setDoOutput(true);//允许向服务端发送数据

            //设置请求头
            //ContentType:application/json
            //Authorization: "Basic "+base64(用户名+密码)
            //Property: 属性
            if (!header.isEmpty()){//如果请求头不为空，则要将用户需要设置的属性
                //设置到请求头中
                //Java中如何遍历map
                Set<String> keys =header.keySet();
                //java中如何遍历set
                for (String key : keys){
                    String value = header.get(key);
                    //将拿到的key和value设置到请求头属性中
                    conn.setRequestProperty(key,value);
                }
            }
            //先连接
            conn.connect();
            //输出流
            output = conn.getOutputStream();
            //将请求的数据发送出去(发送到服务端）
            output.write(data);
            output.flush();

            //接收响应数据
            reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line = null;
            while((line = reader.readLine())!=null){
                result += line;
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                if(reader!=null){
                    reader.close();
                }
                if (output!=null){
                    output.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return  result;
    }
}
